﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Contract.Business.Process;
using Contract.Business.Entity;
using Contract.Business.Filter;
using GenericControlsWinForm.Extensions;

namespace Fast.Presentation.WinForms.Cruds
{
    public partial class FrmPromocao : Form
    {
        public FrmPromocao()
        {
            InitializeComponent();
        }

        #region *** Atributos ***

        BEPromocao entidade;
        BPPromocao processPromocao;
        BPGrupo processGrupo;
        BPProduto processProduto;

        #endregion

        #region *** Botões Crud ***
        private void btnNovo_Click(object sender, EventArgs e)
        {
            if (btnNovo.Text.Equals("Novo"))
            {
                LimparCampos();
                this.chkAtivo.Checked = true;
                this.chkParaSempre.Checked = true;
                grbDados.Enabled = true;
                Utilidades.carregarNovo(grbBotoes);
            }
            else if (ValidarFormulario())
            {
                preencherDados();

                processPromocao = new BPPromocao();
                entidade = processPromocao.Salvar(entidade);

                this.lblCodigo.Text = entidade.Codigo.ToString();

                MessageBox.Show("Promoção cadastrada.");
                grbDados.Enabled = false;
                Utilidades.carregarConfirmarNovo(grbBotoes);
            }
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            if (btnAlterar.Text.Equals("Alterar"))
            {
                grbDados.Enabled = true;
                Utilidades.carregarAlterar(grbBotoes);
            }
            else if (ValidarFormulario())
            {
                preencherDados();

                processPromocao = new BPPromocao();
                entidade = processPromocao.Salvar(entidade);

                MessageBox.Show("Promoção alterada.");
                grbDados.Enabled = false;
                Utilidades.carregarConfirmarAlterar(grbBotoes);
            }
        }

        private void btnConsultar_Click(object sender, EventArgs e)
        {
            FrmPromocaoConsultar frm = new FrmPromocaoConsultar();
            frm.ShowDialog();

            if (frm.entidade != null)
            {
                this.lblCodigo.Text = frm.entidade.Codigo.ToString();
                this.txtNome.Text = frm.entidade.Nome;
                this.txtDesconto.Text = frm.entidade.Desconto.HasValue ? frm.entidade.Desconto.Value.ToString() : String.Empty;

                //Periodicidade
                this.chkParaSempre.Checked = frm.entidade.ParaSempre;
                this.dtpInicio.Text = frm.entidade.DataInicio.HasValue ? frm.entidade.DataInicio.Value.ToString() : String.Empty;
                this.dtpFim.Text = frm.entidade.DataFim.HasValue ? frm.entidade.DataFim.Value.ToString() : String.Empty;

                if (frm.entidade.CodigoProdutoGratis.HasValue)
                {
                    this.cboProdutoGratis.SelectedValue = frm.entidade.CodigoProdutoGratis;
                    processProduto = new BPProduto();
                    BEProduto produto = processProduto.ObterEntidade(frm.entidade.CodigoProdutoGratis.Value);
                    this.cboSubGrupoGratis.SelectedValue = produto.CodigoSubGrupo;
                    this.cboGrupoGratis.SelectedValue = produto.SubGrupo.CodigoGrupo;
                }
                else
                {
                    this.cboProdutoGratis.SelectedValue = 0;
                    this.cboSubGrupoGratis.SelectedValue = 0;
                    this.cboGrupoGratis.SelectedValue = 0;
                }

                if (frm.entidade.CodigoProdutoPromocao.HasValue)
                {
                    this.cboProdutoPromocao.SelectedValue = frm.entidade.CodigoProdutoPromocao;
                    processProduto = new BPProduto();
                    BEProduto produto = processProduto.ObterEntidade(frm.entidade.CodigoProdutoPromocao.Value);
                    this.cboSubGrupoPromocao.SelectedValue = produto.CodigoSubGrupo;
                    this.cboGrupoPromocao.SelectedValue = produto.SubGrupo.CodigoGrupo;

                    this.txtDescontoPromocao.Text = frm.entidade.DescontoPromocao.Value.ToString();
                }
                else
                {
                    this.cboProdutoPromocao.SelectedValue = 0;
                    this.cboSubGrupoPromocao.SelectedValue = 0;
                    this.cboGrupoPromocao.SelectedValue = 0;

                    this.txtDescontoPromocao.Apagar();
                }

                this.txtDesconto.Text = frm.entidade.Desconto.HasValue ? frm.entidade.Desconto.Value.ToString() : String.Empty;
                this.chkAtivo.Checked = frm.entidade.Ativo;

                this.chkDomingo.Checked = frm.entidade.DiasSemana.Contains('1');
                this.chkSegunda.Checked = frm.entidade.DiasSemana.Contains('2');
                this.chkTerca.Checked = frm.entidade.DiasSemana.Contains('3');
                this.chkQuarta.Checked = frm.entidade.DiasSemana.Contains('4');
                this.chkQuinta.Checked = frm.entidade.DiasSemana.Contains('5');
                this.chkSexta.Checked = frm.entidade.DiasSemana.Contains('6');
                this.chkSabado.Checked = frm.entidade.DiasSemana.Contains('7');

                Utilidades.carregarConsultar(grbBotoes);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Deseja excluir este item?", Utilidades.GetProjectName(), MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                processPromocao = new BPPromocao();
                entidade = new BEPromocao();
                entidade.Codigo = int.Parse(this.lblCodigo.Text);

                processPromocao.Excluir(entidade);

                LimparCampos();
                MessageBox.Show("Promoção excluída com sucesso.");
                grbDados.Enabled = false;
                Utilidades.carregarExcluir(grbBotoes);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            LimparCampos();
            grbDados.Enabled = false;
            Utilidades.carregarCancelar(grbBotoes);
        }
        #endregion

        #region *** Eventos ***

        private void FrmPromocao_Load(object sender, EventArgs e)
        {
            UtilidadesListas.carregarGrupos(this.cboGrupoGratis, this.cboGrupoPromocao);
        }

        private void chkParaSempre_CheckedChanged(object sender, EventArgs e)
        {
            this.dtpInicio.Checked = !this.chkParaSempre.Checked;
            this.dtpInicio.Enabled = !this.chkParaSempre.Checked;

            this.dtpFim.Checked = !this.chkParaSempre.Checked;
            this.dtpFim.Enabled = !this.chkParaSempre.Checked;
        }

        private void cboGrupoGratis_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (this.cboGrupoGratis.SelectedValue.ToString() == "0")
                {
                    this.cboSubGrupoGratis.SelectedValue = "0";
                    this.cboSubGrupoGratis.Enabled = false;
                }
                else
                {
                    UtilidadesListas.carregarSubGrupo(this.cboSubGrupoGratis, int.Parse(this.cboGrupoGratis.SelectedValue.ToString()));
                    this.cboSubGrupoGratis.Enabled = true;
                }
                this.cboProdutoGratis.SelectedValue = "0";
                this.cboProdutoGratis.Enabled = false;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void cboSubGrupoGratis_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (this.cboSubGrupoGratis.SelectedValue.ToString() == "0")
                {
                    this.cboProdutoGratis.SelectedValue = "0";
                    this.cboProdutoGratis.Enabled = false;
                }
                else
                {
                    UtilidadesListas.carregarProduto(this.cboProdutoGratis, int.Parse(this.cboSubGrupoGratis.SelectedValue.ToString()));
                    this.cboProdutoGratis.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void cboGrupoPromocao_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (this.cboGrupoPromocao.SelectedValue.ToString() == "0")
                {
                    this.cboSubGrupoPromocao.SelectedValue = "0";
                    this.cboSubGrupoPromocao.Enabled = false;
                }
                else
                {
                    UtilidadesListas.carregarSubGrupo(this.cboSubGrupoPromocao, int.Parse(this.cboGrupoPromocao.SelectedValue.ToString()));
                    this.cboSubGrupoPromocao.Enabled = true;
                }
                this.cboProdutoPromocao.SelectedValue = "0";
                this.cboProdutoPromocao.Enabled = false;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void cboSubGrupoPromocao_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (this.cboSubGrupoPromocao.SelectedValue.ToString() == "0")
                {
                    this.cboProdutoPromocao.SelectedValue = "0";
                    this.cboProdutoPromocao.Enabled = false;
                }
                else
                {
                    UtilidadesListas.carregarProduto(this.cboProdutoPromocao, int.Parse(this.cboSubGrupoPromocao.SelectedValue.ToString()));
                    this.cboProdutoPromocao.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }
        #endregion

        #region *** Métodos ***

        private string montarDiasSemanas()
        {
            StringBuilder sb = new StringBuilder();
            if (chkDomingo.Checked)
                sb.Append("1");
            if (chkSegunda.Checked)
                sb.Append("2");
            if (chkTerca.Checked)
                sb.Append("3");
            if (chkQuarta.Checked)
                sb.Append("4");
            if (chkQuinta.Checked)
                sb.Append("5");
            if (chkSexta.Checked)
                sb.Append("6");
            if (chkSabado.Checked)
                sb.Append("7");

            return sb.ToString();
        }

        private bool ValidarFormulario()
        {
            if (String.IsNullOrEmpty(this.txtNome.Text))
            {
                MessageBox.Show("Campo Descrição é obrigatório.");
                return false;
            }

            if (!this.chkParaSempre.Checked)
            {
                if (!this.dtpInicio.Checked)
                {
                    MessageBox.Show("Campo Início é obrigatório.");
                    return false;
                }

                if (this.dtpFim.Checked)
                {
                    if (this.dtpFim.Value < this.dtpInicio.Value)
                    {
                        MessageBox.Show("Campo Fim não pode ser maior do que início.");
                        return false;
                    }
                }
            }

            return true;
        }

        private void carregarGrupos()
        {
            try
            {
                processGrupo = new BPGrupo();
                List<BEGrupo> lista = processGrupo.ObterTodos(new FEGrupo()).OrderBy(q => q.Descricao).ToList();

                BEGrupo selecione = new BEGrupo();
                selecione.Codigo = 0;
                selecione.Descricao = "Selecione...";

                lista.Insert(0, selecione);

                cboGrupoGratis.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void LimparCampos()
        {
            this.lblCodigo.Text = "...";
            this.txtNome.Apagar();
            this.cboGrupoGratis.SelectedIndex = 0;
            this.cboGrupoPromocao.SelectedIndex = 0;

            this.cboSubGrupoGratis.SelectedIndex = -1;
            this.cboSubGrupoGratis.Enabled = false;

            this.cboSubGrupoPromocao.SelectedIndex = -1;
            this.cboSubGrupoPromocao.Enabled = false;

            this.cboProdutoGratis.SelectedIndex = -1;
            this.cboProdutoGratis.Enabled = false;

            this.cboProdutoPromocao.SelectedIndex = -1;
            this.cboProdutoPromocao.Enabled = false;

            this.chkAtivo.Checked = false;
            this.txtDesconto.Apagar();
            this.txtDescontoPromocao.Apagar();
            this.chkParaSempre.Checked = false;
            this.dtpInicio.Checked = false;
            this.dtpFim.Checked = false;
            this.chkDomingo.Checked = false;
            this.chkSegunda.Checked = false;
            this.chkTerca.Checked = false;
            this.chkQuarta.Checked = false;
            this.chkQuinta.Checked = false;
            this.chkSexta.Checked = false;
            this.chkSabado.Checked = false;
        }

        private void preencherDados()
        {
            entidade = new BEPromocao();
            entidade.Nome = this.txtNome.Text;
            entidade.ParaSempre = this.chkParaSempre.Checked;

            if (!this.chkParaSempre.Checked)
            {
                entidade.DataInicio = this.dtpInicio.Value;
                entidade.DataFim = this.dtpFim.Value;
            }

            if (!String.IsNullOrEmpty(this.txtDesconto.Text))
                entidade.Desconto = Decimal.Parse(this.txtDesconto.Text);

            if (this.cboProdutoGratis.SelectedValue.ToString() != "0")
                entidade.CodigoProdutoGratis = int.Parse(this.cboProdutoGratis.SelectedValue.ToString());

            if (this.cboProdutoPromocao.SelectedValue.ToString() != "0")
            {
                entidade.CodigoProdutoPromocao = int.Parse(this.cboProdutoPromocao.SelectedValue.ToString());
                entidade.DescontoPromocao = Decimal.Parse(this.txtDescontoPromocao.Text);
            }

            entidade.DiasSemana = montarDiasSemanas();
            entidade.Ativo = this.chkAtivo.Checked;
        }
        #endregion
    }
}
